package test

import (
	"log"
	"math/rand"
	"sync"
	"time"
)

func init() {
	log.SetFlags(log.Ldate | log.Lshortfile)
}

func main() {
	rand.Seed(time.Now().UnixNano())
	//  设置日志格式

	const Max = 100000
	const NumSenders = 1000

	wg := sync.WaitGroup{}
	wg.Add(1)

	dataChan := make(chan int)
	stopCh := make(chan struct{})

	// stopCh 是一个额外信号通道，他的发送着为 dataCh 数据通道的接受者。他的接受者为 dataCh 数据通道的发送者
	for i := 0; i < NumSenders; i++ {
		go func() {
			for {
				select {
				case <-stopCh:
					return
				default:
				}

				select {
				case <-stopCh:
					return
				case dataChan <- rand.Intn(Max):
				}
			}
		}()
	}
	// 接受者
	go func() {
		defer wg.Done()
		for value := range dataChan {
			if value == Max-1 {
				close(stopCh)
				return
			}
			log.Println(value)
		}
	}()

	wg.Wait()
}
